import logging
from logging.handlers import RotatingFileHandler
from rich.logging import RichHandler

# 自定义日志级别 IGNORE
IGNORE_LEVEL = 5  # 设置 IGNORE 的日志级别值为 5
logging.addLevelName(IGNORE_LEVEL, "IGNORE")

# 定义一个新的日志方法，用于记录 IGNORE 级别的日志
def ignore(self, message, *args, **kwargs):
    if self.isEnabledFor(IGNORE_LEVEL):
        self._log(IGNORE_LEVEL, message, args, **kwargs)

# 将 ignore 方法绑定到 logging.Logger 类
logging.Logger.ignore = ignore

# 使用 RichHandler 替换控制台处理器
rich_handler = RichHandler(rich_tracebacks=True)  # rich_tracebacks 可提供更丰富的堆栈追踪
rich_handler.setLevel(logging.INFO)  # 控制台输出 INFO 级别及以上
rich_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)-8s %(message)s'))  # 设置格式

# 创建 RotatingFileHandler，设置最大文件大小为 4MB，最多保留 16 个备份文件
file_handler = RotatingFileHandler(
    'app.log',
    maxBytes=4 * 1024 * 1024,  # 每个文件最大为 4MB
    backupCount=16             # 保留最多 16 个备份文件
)
file_handler.setLevel(IGNORE_LEVEL)  # 文件输出 DEBUG 级别及以上
file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)-8s %(message)s'))  # 格式化文件输出

# 获取 root logger 并设置日志级别为 DEBUG
logger = logging.getLogger()
logger.setLevel(IGNORE_LEVEL)

# 添加 RichHandler 和 RotatingFileHandler
logger.addHandler(rich_handler)
logger.addHandler(file_handler)

# 打印不同级别的日志信息
logger.debug('这是调试信息')   # 控制台和文件都会记录
logger.info('这是信息')       # 控制台和文件都会记录
logger.warning('这是警告')     # 控制台和文件都会记录
logger.error('这是错误')       # 控制台和文件都会记录
logger.critical('这是严重错误')  # 控制台和文件都会记录
logger.ignore('这是忽略级别的信息')  # 只在代码中使用 IGNORE 级别